#include <iostream>
#include <etcd/Client.hpp>
#include <etcd/Response.hpp>
#include <etcd/KeepAlive.hpp>
#include <thread>
/*
    etcd-cpp-apiv3是一个etcd的C++版本客户端API

    使用etcd-cpp-apiv3库来访问etcd服务，测试etcd服务的注册功能，测试带有租约的kv和不带租约的kv
*/

int main()
{
    // 1、创建客户端
    const std::string etcd_url = "http://127.0.0.1:2379";
    etcd::Client client(etcd_url);

    // 2、获取租约保活对象 -- pplx::task 并行库异步结果对象
    pplx::task<std::shared_ptr<etcd::KeepAlive>> task_keepalive = client.leasekeepalive(20); //内部伴随着创建一个KeepAlive对象
    // 获取异步结果对象中的租约保活对象 -- 保活对象销毁，则意味着无法续约，那么ttl到期数据就会销毁
    std::shared_ptr<etcd::KeepAlive> keepalive = task_keepalive.get();

    // 3、获取租约id
    int64_t lease_id = keepalive->Lease();

    // 4、访问etcd服务插入数据
    std::string key = "/services/user"; // etcd中的key不仅仅是一个字符串key，它还提供了目录功能
    std::string val = "8.138.153.234:2379";
    // 4.1、client获得的结果都是异步对象 -- 添加有租约的数据
    // 相同的key会发生覆盖，本来有租约的数据可以不加租约，变成无租约
    pplx::task<etcd::Response> task_response = client.put(key, val, lease_id);
    etcd::Response resp = task_response.get();
    if (resp.is_ok() == false)
    {
        std::cout << "有租约的数据put错误:" << resp.error_message() << std::endl;
        return -1;
    }

    // 4.2、client获得的结果都是异步对象 -- 添加无租约的数据
    key = "/services/server";
    val = "127.0.0.1:8888";
    task_response = client.put(key, val);
    resp = task_response.get();
    if (resp.is_ok() == false)
    {
        std::cout << "无租约的数据put错误:" << resp.error_message() << std::endl;
        return -1;
    }

    // 4.3、在ttl结束之前撤销租约
    // std::this_thread::sleep_for(std::chrono::seconds(10));
    // client.leaserevoke(lease_id); 

    // 5、等待一段时间
    std::this_thread::sleep_for(std::chrono::seconds(500));

    return 0;
}